package com.example.demozy.controller;

import com.example.demozy.api.CommonResult;
import com.example.demozy.entity.Administrator;
import com.example.demozy.entity.User;
import com.example.demozy.service.AdministratorService;
import com.example.demozy.service.UserService;
import com.example.demozy.vo.LoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 王成龙
 */
@RestController
public class LoginController {
    // **************** 公开变量

    // **************** 私有变量

    @Autowired
    private UserService userService;

    @Autowired
    private AdministratorService administratorService;

    // **************** 继承方法

    // **************** 公开方法

    /**
     * 登录
     * @param user : 将JSON字符串中的值userName、userPwd分别赋予user中对应的属性上
     */
    @PostMapping(value = "/login")
    public CommonResult login(@RequestBody User user) {
        String account = user.getAccount();
        String userPwd = user.getUserPwd();
        //检验账号密码是否为空
        if ("".equals(account) || "".equals(userPwd)) {
            return CommonResult.failed("用户名或密码不能为空！");
        }
        //检验账号是否包含特殊字符串
        if (isSpecialChar(account)) {
            return CommonResult.failed("账号不能包含特殊字符串！");
        }
        //检验账号密码长度，若中文超过8位或字母加数字超过16位，则校验不通过
        int accountLength = getStringLengthRegex(account);
        int userPwdLength = getStringLengthRegex(userPwd);
        if (accountLength > 16 || userPwdLength > 16) {
            return CommonResult.failed("账号过长！");
        }
        //判断返回的list是否为空集合即size是否为0，若为空集合则登录失败，反之登录成功
        List<User> userList = userService.listUsers(account,userPwd);
        if (userList.size() != 0) {
            User userToLogin = userList.get(0);
            Administrator admin = administratorService.getAdminIdByUserId(userToLogin.getUserId());
            LoginVO loginVO = new LoginVO();
            loginVO.setId(userToLogin.getUserId());
            loginVO.setToken(UUID.randomUUID().toString());
            loginVO.setUser(userToLogin);
            //判断是否为管路员
            if (admin == null) {
                loginVO.setIsAdmin(0);
            } else {
                loginVO.setIsAdmin(1);
            }
            return CommonResult.success(loginVO,"登陆成功！");
        } else {
            return CommonResult.validateFailed("账号或密码错误！");
        }
    }

    /**
     * 判断是否含有特殊字符
     *
     * @param str
     * @return true为包含，false为不包含
     */
    public boolean isSpecialChar(String str) {
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 正则获取字符串长度
     * 基本原理是将字符串中所有的非标准字符（双字节字符）替换成两个标准字符（**，或其他的也可以）。
     * 这样就可以直接例用length方法获得字符串的字节长度了
     * @param str
     */
    public int getStringLengthRegex(String str) {
        str = str.replaceAll("[^\\x00-\\xff]", "**");
        int length = str.length();
        return length;
    }


    // **************** 私有方法

}
